/*
    封装、继承、多态
    1、在继承关系或者实现关系中，对于同一个方法，在不同情况表现出多种形态称为多态
    打印机：打印功能
    打印机要依赖于墨盒和纸张
    黑白墨盒+A4纸张
    彩色墨盒+A4纸张
*/
// class GrayInk{
//     color:string="黑白"
// }
// class ColorInk{
//     color:string="彩色"
// }
// class A4Paper{
//     size:string="A4纸张"
// }
// class B5Paper{
//     size:string="B5纸张"
// }

// class Printer{
//     /*
//         打印机中的打印黑白色，纸张是A4纸的打印机
//     */
//     print1(ink:GrayInk,paper:A4Paper):void{
//         console.log(ink.color);
//         console.log(paper.size);
//     }
//     print2(ink:ColorInk,paper:A4Paper):void{
//         console.log(ink.color);
//         console.log(paper.size);
//     }
//     print3(ink:GrayInk,paper:B5Paper):void{
//         console.log(ink.color);
//         console.log(paper.size);
//     }
//     print4(ink:ColorInk,paper:B5Paper):void{
//         console.log(ink.color);
//         console.log(paper.size);
//     }
    
// }

// let hp=new Printer()
// hp.print1(new GrayInk(),new A4Paper())
// hp.print2(new ColorInk(),new A4Paper())
// hp.print3(new GrayInk(),new B5Paper())
// hp.print4(new ColorInk(),new B5Paper())

class Ink{
    color:string=''
}
class GrayInk extends Ink{
    color: string="黑白"
}
class ColorInk extends Ink{
    color: string="彩色"
}
class Paper{
    size:string=''
}
class A4Paper extends Paper{
    size: string="A4纸张"
}
class B5Paper extends Paper{
    size: string="B5纸张"
}
/**
 * 
 * 开闭原则：对修改关闭，对扩展开放
 * 高内聚、低耦合
 * 
 * 实现方式
 * 多态
 * 在定义方法的时候，如果要依赖与别的类建议使用父类，因为父类比较的抽象，易于后续实现多态
 * 在调用方法的时候，传递实参传递是具体类的实例
 */
class Printer{
    //依赖关系
    print(ink:Ink,paper:Paper){
        console.log(ink.color);
        console.log(paper.size);
    }
}
let hp=new Printer()
hp.print(new GrayInk(),new B5Paper())


